package com.ruoyi.cms.config;

/**
 * 根据手机号和雪花算法生成的ID生成用户ID和分表索引
 * 手机号基因法注入到用户uid
 *
 * @author houyong
 */
public class PhoneAndUserIdGeneUtils {
    public static void main(String[] args) {
// 假设分表数量为 16（N=16）
        int tableCount = 16;
        String phone = "13840138011";
// 计算手机号的哈希值（避免负数，取绝对值）
        int hash = Math.abs(phone.hashCode());
// 取模得到分表索引（基因）
        int tableIndex = hash % tableCount; // 结果为 0~15 中的一个
        System.out.println("分表索引：" + tableIndex);
        // 假设通过雪花算法生成的基础ID（高56位，仅示例）
        long baseId = 1234567890123456L;

        System.out.println(baseId);

// 将baseId左移4位，腾出低4位
        long uid = (baseId << 4) | tableIndex;
// 此时uid的低4位就是tableIndex（分表基因）

        System.out.println(uid);

        int tableIndexByUid = (int) (uid & 0xF);  // 取uid的低4位
        System.out.println("分表索引：" + tableIndexByUid);

        // TODO 如果用户uid已经生成后，用户想变更手机号怎么办？
        // 第一种方案：
        // 1.有一个有手机号和表所在index的中间表 例如 phone在哪一个 表
        // 2.用户修改手机号时，先查询中间表，然后根据手机号查询表index
        // 3.用户修改手机号时，将新的手机号和表index插入中间表

        // 二、将新手机号按照基因法注入生成新的uid,
        // 将用户uid下的数据移动到新的用户uid下
    }
}
